有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JUnit测试以接口为参数的方法

正如标题所述,我想测试以下方法:

Class A:

private List<String> s;
    
public A() {
    s = new ArrayList<String>();
    s.add("Gregor");
    s.add("Example");
    s.add("Example2");
}

public String argr(B b) { //B-> Interface
        int t = b.t();
        String r = "Hello ";
        for(String z:s ) {
            boolean x = b.f(t, 5);
            if(x) {
                r += z;
            }
        }
        return r;
    }

使用接口B:

public interface B {
    int t();
    boolean f(int t, int i);
}

测试:

class Example{
  public B b;
  private A example = new A();

  @Test
  void test() {
    //assert(example .s() == "Hello GregorExampleExample2");
        
    System.out.println(example .s(b));
        
    //bsp.A(c);
    }

}

问题:方法b需要一个Interface作为参数,接口可以通过这个方法实现:Class A implements B{}

问题:测试时,它无法识别类A中接口实现的方法

问题1:如何使用接口作为参数测试jUnit方法

问题2:您需要在jUnit测试类中实现接口方法吗


共 (1) 个答案

  1. # 1 楼答案

    您可以为每个测试用例创建这样的匿名类:

    b = new B() {
        @Override
        public int t() {
            return 0;
        }
    
        @Override
        public boolean f(int t, int i) {
            return false;
        }
    };
    

    只需将返回值替换为适合您的测试用例的值,但尽量避免在类中放入任何逻辑(因为那样您也必须对其进行测试)

    如果您不想为每个测试用例实现接口,另一种可能性是使用Mockito来模拟您的接口:

    B mock = Mockito.mock(B.class);
    Mockito.when(mock.f(Mockito.anyInt(), Mockito.anyInt())).thenReturn(false);